// $codepro.audit.disable
package org.mysofts.eclipseman.launch; // $codepro.audit.disable tooManyViolations

import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.List;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.ParseException;
import org.apache.commons.io.FileUtils;
import org.mysofts.eclipseman.Eclipse;
import org.mysofts.eclipseman.EclipseInstallations;
import org.mysofts.eclipseman.launch.util.AbstractLauncher;
import org.mysofts.eclipseman.util.MessageProvider;

/**
 * Duplique un eclipse installé.
 * 
 * @author reda
 * 
 */
public final class EclipseDuplicate extends AbstractLauncher { // $codepro.audit.disable
																// declareDefaultConstructors
	/**
	 * Nom du script.
	 */
	public static final String SCRIPT_NAME = "eclipse-duplicate";

	/**
	 * Nom de l'eclipse à dupliquer.
	 */
	private String toDuplicateName;
	/**
	 * Nom de l'eclipse à créer.
	 */
	private String toCreateName;
	/**
	 * Eclipse à dupliquer.
	 */
	private Eclipse eclipseToDuplicate;
	/**
	 * Repertoire de l'eclipse à créer.
	 */
	private File eclipseDirToCreate;

	/**
	 * Constructeur.
	 * 
	 * @param args
	 *            arguments.
	 */
	public EclipseDuplicate(final String[] args) {
		super(MessageFormat.format(
				"{0} <eclipse à dupliquer> <eclipse à créer>",
				EclipseDuplicate.SCRIPT_NAME), args);
	}

	@Override
	protected void parseArguments(final String[] args) throws ParseException {
		if (2 != args.length) {
			throw new ParseException(MessageFormat.format(
					MessageProvider.get("logs").sub("launchers").sub("errors")
							.sub("argerror").value(), 2));
		}
		this.toDuplicateName = args[0];
		this.toCreateName = args[1];
	}

	@Override
	protected void parseOptions(final CommandLine commandLine)
			throws ParseException {
	}

	@Override
	protected void createOptions(final List<Option> optlist) {
	}

	/**
	 * Identifie l'eclipse à dupliquer.
	 */
	private void identifyEclipseToDuplicate() {
		this.eclipseToDuplicate = EclipseInstallations.get().getEclipse(
				this.toDuplicateName);
		if (null == this.eclipseToDuplicate) {
			this.functionnalError(MessageFormat.format(
					MessageProvider.get("logs").sub("launchers")
							.sub("duplicate").sub("errors").sub("badoldname")
							.value(), this.toDuplicateName));
		}
	}

	/**
	 * Verifie le nom de l'eclipse à créer.
	 */
	private void checkNewName() {
		this.eclipseDirToCreate = new File(
				EclipseInstallations.ECLIPSE_DIRECTORY, this.toCreateName);
		if (this.eclipseDirToCreate.exists()) {
			this.functionnalError(MessageFormat.format(
					MessageProvider.get("logs").sub("launchers").sub("errors")
							.sub("badnnewame").value(), this.toCreateName));
		}
	}

	/**
	 * Procède à la duplication.
	 */
	private void duplicate() {
		try {
			System.out.print(MessageFormat.format(MessageProvider.get("logs")
					.sub("launchers").sub("duplicate").sub("during").value(),
					this.toDuplicateName, this.toCreateName));
			FileUtils.copyDirectory(this.eclipseToDuplicate.getDirectory(),
					this.eclipseDirToCreate);
			System.out.println(OK);
		} catch (final IOException e) {
			System.out.println(NOK);
			this.functionnalError(e.getMessage());
		}
	}

	/**
	 * Main.
	 * 
	 * @param args
	 *            arguments.
	 */
	public static void main(final String[] args) {
		final EclipseDuplicate obj = new EclipseDuplicate(args);
		obj.identifyEclipseToDuplicate();
		obj.checkNewName();
		obj.duplicate();
	}
}
